selinux参考策略实验记录

selinux 参考策略的安装以及编写自己的策略模块。

实验环境

  • 需要使用python3,2不可以。
  • Fedora30或centos7

参考策略安装过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
可以在主目录下
# cd ~
# git clone https://github.com/SELinuxProject/refpolicy.git
添加contibuted模块(policy / modules / contrib)
# git submodule init
# git submodule update

编辑build.conf文件以反映要构建的策略, NAME = refpolicy, DISTRO选项需要取消注释并设置为redhat,DIRECT_INITRC应设置为y
# vim ~/refpolicy/src/policy/build.conf

在策略构建位置安装源。
# cd ~/refpolicy

# sudo make install-src
此命令会将整个源文件复制到/etc/selinux/refpolicy/src/policy下

# cd /etc/selinux/refpolicy/src/policy
# make bare
# make conf
# make install
构建初始策略/ booleans.conf和policy / modules.conf文件
此过程还将构建policy / modules / kernel / corenetwork.te / corenetwork.if文件(如果尚未存在)。这些将基于corenetwork.te.in和corenetwork.if.in配置文件的内容(对于这个简单的配置,这些文件不会被编辑)。

# make load
构建策略,将模块添加到存储并安装二进制内核策略及其支持配置文件。

# vim /etc/selinuc/config
编辑/etc/selinuc/config,修改SELINUX=permissive,SELINUXTYPE=refpolicy

需要使用新策略重新启动系统,并在引导时重新标记,以完成交换。
# touch /.autorelabel
# shutdown -r now

构建和安装头文件

1
2
3
4
5
6
7
# cd /etc/selinux/refpolicy/src/policy
# make install-headers
生成一个build.conf文件,该文件表示master build.conf文件的内容,并将其放在/ usr / share / selinux / refpolicy / include目录中。
生成反映源的XML文档集,并将其放在/ usr / share / selinux / refpolicy / include目录中。
将用于构建的开发Makefile从策略标头复制到/ usr / share / selinux / refpolicy / include目录。
将支持宏.spt文件复制到/ usr / share / selinux / refpolicy/ include / support目录。这还将包含一个all_perms.spt文件,该文件将包含允许解析所有类和权限的宏。
将模块接口文件(.if)复制到以下相关模块目录:/usr/share/selinux/refpolicy/include/modules

编写自己的策略模块

1
2
3
4
5
6
7
cd ~
mkdir myapp
创建四个文件,分别添加下面的内容。
vim myapp.te
vim myapp.if
vim myapp.fc
vim Makefile

↓myapp.te

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
policy_module(myapp,1.0)

# Private type declarations
type myapp_t;
type myapp_exec_t;
type myapp_log_t;
type myapp_tmp_t;

domain_type(myapp_t)
domain_entry_file(myapp_t, myapp_exec_t)
logging_log_file(myapp_log_t)
files_tmp_file(myapp_tmp_t)

allow myapp_t myapp_log_t:file append_file_perms;
allow myapp_t myapp_tmp_t:file manage_file_perms;

files_tmp_filetrans(myapp_t,myapp_tmp_t,file)

↓myapp.fc

1
/usr/bin/myapp    --  gen_context(system_u:object_r:myapp_exec_t,s0)

↓myapp.if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
## <summary>Myapp example policy</summary>
## <desc>
## <p>
## More descriptive text about myapp. The desc
## tag can also use p, ul, and ol
## html tags for formatting.
## </p>
## <p>
## This policy supports the following myapp features:
## <ul>
## <li>Feature A</li>
## <li>Feature B</li>
## <li>Feature C</li>
## </ul>
## </p>
## </desc>

########################################
## <summary>
## Execute a domain transition to run myapp.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed to transition.
## </summary>
## </param>

interface(`myapp_domtrans',\`
gen_requires(`
type myapp_t, myapp_exec_t;
')

domtrans_pattern($1,myapp_exec_t,myapp_t)
')

########################################
## <summary>
## Read myapp log files.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed to read the log files.
## </summary>
## </param>

interface(`myapp_read_log',\`
gen_requires(`
type myapp_log_t;
')

logging_search_logs($1)
allow $1 myapp_log_t:file read_file_perms;
')

↓Makefile

1
2
3
4
5
6
7
AWK ?= gawk

NAME ?= $(shell $(AWK) -F= '/^SELINUXTYPE/{ print $$2 }' /etc/selinux/config)
SHAREDIR ?= /usr/share/selinux
HEADERDIR := $(SHAREDIR)/$(NAME)/include

include $(HEADERDIR)/Makefile

1
2
3
4
5
6
7
8
cd ~/myapp
make

要加载模块,您必须以允许运行的角色以root身份运行semodule。然后运行semodule -i以将模块插入正在运行的策略中:
semodule -i myapp.pp

查看是否有myapp模块
semodule -l | grep myapp

错误记录

  • 修改selinux导致无法开机
    1
    2
    3
    在Grub启动菜单上按e进入编辑模式,在启动项
    “kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/vogroup00/logvol00 rhgb quiet”
    后面加上 enforcing=0 ,然后启动即可。